package com.sprouting.ops.model;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;

/**
 * 统一文件存储记录信息
 * 和 {@link org.dromara.x.file.storage.core.FileInfo} 数据差不多
 *
 * @author ：LX（长沙麓谷）
 * @date 创建时间： 2025/2/10 17:33
 */
@Data
@TableName("ops_dromara_file_storage")
public class DromaraFileStorage {

    /**
     * 主键
     */
    @TableId
    private String id;
    /**
     * 文件访问地址
     * 本地示例：asset/user/ico/2023/10/6555e468390f10442307c0fc.png
     * 其他的则是 domain(访问域名) + basePath + path + filename
     */
    private String url;
    /**
     * 文件大小，单位字节
     */
    private Long size;
    /**
     * 文件名称,带后缀
     * 保存的文件名，可以在上传时通过 setSaveFilename() 设置，默认通过雪花算法生成
     * 本地示例：6555e468390f10442307c0fc.png
     */
    private String filename;
    /**
     * 原始文件名
     * 原始文件名，会自动从上传的文件中获取，如果通过 InputStream 、 byte[] 等方式上传则无法获取，可以通过 setOriginalFilename() 设置
     */
    private String originalFilename;
    /**
     * 基础存储路径
     * 主要用于不同的环境或项目共用同一个存储平台的情况，这时就可以通过 basePath 来区分，例如这里的 dev/ 就表示开发环境，测试环境就可以配置成 test/ ，如果不需要可以留空
     */
    private String basePath;
    /**
     * 存储路径,相对路径
     * 主要用于区分不同的页面，例如 cover/ 表示文章封面，avatar/ 表示用户头像，如果不需要可以留空
     * 注意，不含文件名称， 本地示例：user/ico/2023/10/
     */
    private String path;
    /**
     * 文件扩展名，如：png
     */
    private String ext;
    /**
     * MIME类型，比如：application/pdf，image/png
     * 一般用在写出数据的时候，给http请求中设置这些信息
     */
    private String contentType;
    /**
     * 存储平台
     */
    private String platform;
    /**
     * 缩略图访问路径
     */
    private String thUrl;
    /**
     * 缩略图名称
     */
    private String thFilename;
    /**
     * 缩略图大小，单位字节
     */
    private Long thSize;
    /**
     * 缩略图MIME类型
     */
    private String thContentType;
    /**
     * 绑定id， 可以理解为组ID，比如购物信息中有多个图片，那么这里就是购物信息的ID。比如头像id，绑定的是用户表人员
     * 比如，书本的封面，则是书本的id之类的。这里只是记录id，还要和 bindType字段合并起来用
     * @see OpsUser#getId() 比如人员的照片等
     */
    private String objectId;
    /**
     * 资料类型，从哪个表来的数据
     * @see com.sprouting.ops.interfaces.ConstantBase.FileSourceType
     */
    private String objectType;
    /**
     * 文件元数据
     */
    private String metadata;
    /**
     * 文件用户元数据
     */
    private String userMetadata;
    /**
     * 缩略图元数据
     */
    private String thMetadata;
    /**
     * 缩略图用户元数据
     */
    private String thUserMetadata;
    /**
     * 附加属性
     */
    private String attr;
    /**
     * 文件ACL
     */
    private String fileAcl;
    /**
     * 缩略图文件ACL
     */
    private String thFileAcl;
    /**
     * 哈希信息
     */
    private String hashInfo;
    /**
     * 上传ID，仅在手动分片上传时使用
     */
    private String uploadId;
    /**
     * 上传状态，仅在手动分片上传时使用，1：初始化完成，2：上传完成
     */
    private Integer uploadStatus;
    /**
     * 创建时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createTime;


    /*
    ================================= 额外添加的属性 ========================================
    ================================= 额外添加的属性 ========================================
     */

    /**
     * 隶属用户;-1则是全局的
     * @see OpsUser#getId()
     * @see com.sprouting.ops.interfaces.ConstantBase.DefaultValue#STRING 全局
     */
    private String userId;
    /**
     * 是否临时文件;临时文件指刚上传，但可能数据还没入库的，超时会进行删除的
     * @see com.sprouting.ops.interfaces.ConstantBase.TempFile
     */
    private Integer tempFile;
    /**
     * 删除文件时间，超过该时间则可以删除
     * 在新增的图片可能只是临时图片，比如用户只进行了头像上传，没有进行用户保存，这种数据是脏数据，需要清理的，默认48小时未处理的为脏数据，需要清理
     * 还有一种是比如一本书被删除了，在表中设置为临时文件，要进行删除，但担心可能其他问题，会留下来进行一段时间，只有标记为临时文件，且过了当前时间才能删除
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern="yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date delTime;
}
